const { Sequelize } = require('sequelize');
const mysql = require('mysql2/promise');
require('dotenv').config();

// 创建数据库（如果不存在）
const createDatabaseIfNotExists = async () => {
    try {
        const connection = await mysql.createConnection({
            host: process.env.DB_HOST,
            port: process.env.DB_PORT,
            user: process.env.DB_USER,
            password: process.env.DB_PASSWORD
        });
        
        await connection.query(`CREATE DATABASE IF NOT EXISTS ${process.env.DB_NAME}`);
        console.log(`数据库 ${process.env.DB_NAME} 创建成功或已存在`);
        await connection.end();
    } catch (error) {
        console.error('创建数据库失败:', error);
        process.exit(1);
    }
};

// 创建Sequelize实例，连接到MySQL数据库
const sequelize = new Sequelize(
    process.env.DB_NAME,
    process.env.DB_USER,
    process.env.DB_PASSWORD, 
    {
        host: process.env.DB_HOST,
        port: process.env.DB_PORT,
        dialect: 'mysql',
        logging: process.env.NODE_ENV === 'development' ? console.log : false,
        pool: {
            max: 5,            // 连接池最大连接数
            min: 0,            // 连接池最小连接数
            acquire: 30000,    // 获取连接的最大等待时间(毫秒)
            idle: 10000        // 连接在被释放之前可以空闲的最长时间(毫秒)
        },
        define: {
            timestamps: true,  // 默认添加 createdAt 和 updatedAt 字段
            underscored: true, // 使用下划线而不是驼峰命名法 (如 created_at 而非 createdAt)
        }
    }
);

// 测试数据库连接
const testConnection = async () => {
    try {
        // 先创建数据库（如果不存在）
        await createDatabaseIfNotExists();
        
        await sequelize.authenticate();
        console.log('数据库连接成功');
        
        // 同步所有模型并自动创建表
        // force: true 会在每次应用启动时删除所有表并重新创建（仅在开发环境使用）
        const forceSync = process.env.NODE_ENV === 'development' && process.env.DB_FORCE_SYNC === 'true';
        console.log(`数据库同步模式: ${forceSync ? '强制重建' : '常规更新'}`);
        await sequelize.sync({ force: forceSync });
        console.log('数据库表同步完成');
    } catch (error) {
        console.error('数据库连接失败:', error);
        process.exit(1);
    }
};

module.exports = { sequelize, testConnection }; 